﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AutoMapper;
using DTO;
using System.Transactions;

namespace DAO
{
    public class PhieuTraSachDAO
    {
        public static List<ChiTietPhieuTraDTO> SachDangMuon(int maDocGia)
        {
            //tạo list chi tiết
            List<ChiTietPhieuTraDTO> listSachMuon = new List<ChiTietPhieuTraDTO>();

            //khởi tạo datacontext
            QuanLyThuVienDataContext context = new QuanLyThuVienDataContext();

            //đọc tham số
            int tienTraTre = (int)context.ThamSos.Single(c => c.TenThamSo == "TienPhatTraTre").GiaTri;

            //đọc dữ liệu
            var query = from pms in context.PhieuMuonSaches
                        join ctpm in context.ChiTietPhieuMuons on pms.MaPhieuMuon equals ctpm.MaPhieuMuon
                        join s in context.Saches on ctpm.MaSach equals s.MaSach
                        where pms.MaDocGia == maDocGia && s.MaTinhTrang == 2 && ctpm.DanhDau == 0
                        select new
                        {
                            MaChiTietPhieuTra = 0,
                            MaPhieuTraSach = 0,
                            MaSach = ctpm.MaSach,
                            NgayMuon = pms.NgayMuon,
                            SoNgayMuon = DateTime.Today.Subtract(pms.NgayMuon).TotalDays,
                            SoNgayTraTre = DateTime.Today.Subtract(pms.NgayHetHan).TotalDays,
                            TienPhat = 0
                        }
                        ;

            //duyệt từng phần tử
            foreach (var n in query)
            {
                //tạo chi tiết phiếu trả dto
                ChiTietPhieuTraDTO ctpt = new ChiTietPhieuTraDTO();
                
                //gán dữ liệu
                ctpt.MaChiTietPhieuTra = n.MaChiTietPhieuTra;
                ctpt.MaPhieuTraSach = n.MaPhieuTraSach;
                ctpt.MaSach = n.MaSach;
                ctpt.NgayMuon = n.NgayMuon;
                ctpt.SoNgayMuon = (int)n.SoNgayMuon;
                ctpt.SoNgayTraTre = (int)n.SoNgayTraTre;
                ctpt.TienPhat = (int)n.SoNgayTraTre * tienTraTre;
                
                //nếu không có sách quá hạn
                if (ctpt.TienPhat < 0)
                    ctpt.TienPhat = 0;

                //thêm vào list
                listSachMuon.Add(ctpt);
            }
            return listSachMuon;
        }

        public static bool Them(PhieuTraSachDTO dtoPhieuTra, List<ChiTietPhieuTraDTO> listSachTra)
        {
            using (TransactionScope scope = new TransactionScope())
            {
                //khởi tạo datacontext
                QuanLyThuVienDataContext context = new QuanLyThuVienDataContext();

                //Thêm phiếu trả
                PhieuTraSach pts = new PhieuTraSach();

                //mapping
                Mapper.CreateMap<PhieuTraSachDTO, PhieuTraSach>();
                pts = Mapper.Map<PhieuTraSachDTO, PhieuTraSach>(dtoPhieuTra);

                //duyệt danh sách sách trả
                foreach (ChiTietPhieuTraDTO dtoctpt in listSachTra)
                {
                    //tạo mới chi tiết
                    ChiTietPhieuTra ctpt = new ChiTietPhieuTra();

                    //mapping
                    Mapper.CreateMap<ChiTietPhieuTraDTO, ChiTietPhieuTra>();
                    ctpt = Mapper.Map<ChiTietPhieuTraDTO, ChiTietPhieuTra>(dtoctpt);

                    //thêm vào phiếu trả sách
                    pts.ChiTietPhieuTras.Add(ctpt);

                    //cập nhật tình trạng sách về chưa cho mượn
                    Sach n = context.Saches.Single(c => c.MaSach == dtoctpt.MaSach);
                    n.MaTinhTrang = 1;

                    //đánh dấu xóa cho chi tiết phiếu mượn
                    foreach (ChiTietPhieuMuon ctpm in context.ChiTietPhieuMuons)
                    {
                        if (ctpm.MaSach == n.MaSach)
                            ctpm.DanhDau = 1;
                    }
                }

                //thêm phiếu trả vào csdl
                context.PhieuTraSaches.InsertOnSubmit(pts);

                //thực hiện thay đổi
                context.SubmitChanges();

                //transaction thành công
                scope.Complete();
            }
            return true;
        }
    }
}
